From 5885ed8e6db7648e6842d9811aace7edc4e8aba7 Mon Sep 17 00:00:00 2001
From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Date: Wed, 20 Apr 2022 11:16:52 +0200
Subject: [PATCH] buildtools/wafsamba: add --disable-stack-protector option

Allow the user to disable stack-protector through
--disable-stack-protector to avoid the following build failure with
libtalloc on embedded toolchains which don't support stack-protector:

/home/autobuild/autobuild/instance-5/output-1/host/lib/gcc/i686-buildroot-linux-musl/9.4.0/../../../../i686-buildroot-linux-musl/bin/ld: talloc.c.5.o: in function `_vasprintf_tc':
talloc.c:(.text+0x427d): undefined reference to `__stack_chk_fail_local'

This build failure is raised since
https://gitlab.com/ffontaine/samba/-/commit/38e97f8b52e85bdfcf2d74a4fb3c848fa46ba371
because stack-protector is enabled on libtalloc despite the fact that
libssp is not available:

Checking if compiler accepts -fstack-protector-strong                                           : yes

Fixes:
 - http://autobuild.buildroot.org/results/e221bde25c7622db99761d0adcd56663296beb15

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
[Upstream status:
https://gitlab.com/samba-team/samba/-/merge_requests/2493]
---
 buildtools/wafsamba/samba_autoconf.py | 49 ++++++++++++++-------------
 buildtools/wafsamba/wscript           |  3 ++
 2 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/buildtools/wafsamba/samba_autoconf.py b/buildtools/wafsamba/samba_autoconf.py
index 78927d85193..23a995e1c34 100644
--- a/buildtools/wafsamba/samba_autoconf.py
+++ b/buildtools/wafsamba/samba_autoconf.py
@@ -703,9 +703,28 @@ def SAMBA_CONFIG_H(conf, path=None):
     if not IN_LAUNCH_DIR(conf):
         return
 
-    # we need to build real code that can't be optimized away to test
-    stack_protect_list = ['-fstack-protector-strong', '-fstack-protector']
-    for stack_protect_flag in stack_protect_list:
+    if not Options.options.disable_stack_protector:
+        # we need to build real code that can't be optimized away to test
+        stack_protect_list = ['-fstack-protector-strong', '-fstack-protector']
+        for stack_protect_flag in stack_protect_list:
+            flag_supported = conf.check(fragment='''
+                                        #include <stdio.h>
+
+                                        int main(void)
+                                        {
+                                            char t[100000];
+                                            while (fgets(t, sizeof(t), stdin));
+                                            return 0;
+                                        }
+                                        ''',
+                                        execute=0,
+                                        cflags=[ '-Werror', '-Wp,-D_FORTIFY_SOURCE=2', stack_protect_flag],
+                                        mandatory=False,
+                                        msg='Checking if compiler accepts %s' % (stack_protect_flag))
+            if flag_supported:
+                conf.ADD_CFLAGS('%s' % (stack_protect_flag))
+                break
+
         flag_supported = conf.check(fragment='''
                                     #include <stdio.h>
 
@@ -717,29 +736,11 @@ def SAMBA_CONFIG_H(conf, path=None):
                                     }
                                     ''',
                                     execute=0,
-                                    cflags=[ '-Werror', '-Wp,-D_FORTIFY_SOURCE=2', stack_protect_flag],
+                                    cflags=[ '-Werror', '-fstack-clash-protection'],
                                     mandatory=False,
-                                    msg='Checking if compiler accepts %s' % (stack_protect_flag))
+                                    msg='Checking if compiler accepts -fstack-clash-protection')
         if flag_supported:
-            conf.ADD_CFLAGS('%s' % (stack_protect_flag))
-            break
-
-    flag_supported = conf.check(fragment='''
-                                #include <stdio.h>
-
-                                int main(void)
-                                {
-                                    char t[100000];
-                                    while (fgets(t, sizeof(t), stdin));
-                                    return 0;
-                                }
-                                ''',
-                                execute=0,
-                                cflags=[ '-Werror', '-fstack-clash-protection'],
-                                mandatory=False,
-                                msg='Checking if compiler accepts -fstack-clash-protection')
-    if flag_supported:
-        conf.ADD_CFLAGS('-fstack-clash-protection')
+            conf.ADD_CFLAGS('-fstack-clash-protection')
 
     if Options.options.debug:
         conf.ADD_CFLAGS('-g', testflags=True)
diff --git a/buildtools/wafsamba/wscript b/buildtools/wafsamba/wscript
index 8729b0829da..d75bb3b1c0c 100644
--- a/buildtools/wafsamba/wscript
+++ b/buildtools/wafsamba/wscript
@@ -165,6 +165,9 @@ Currently the only tested value is 'smbtorture,smbd/smbd' for Samba'''),
     gr.add_option('--disable-warnings-as-errors',
                    help=("Do not treat all warnings as errors (disable -Werror)"),
                    action="store_true", dest='disable_warnings_as_errors', default=False)
+    gr.add_option('--disable-stack-protector',
+                   help=("Disable stack-protector"),
+                   action="store_true", dest='disable_stack_protector', default=False)
     opt.add_option('--enable-coverage',
                    help=("enable options necessary for code coverage "
                          "reporting on selftest (default=no)"),
-- 
2.35.1

